package dao.majorunit;

import java.util.List;

import util.paramvo.MemberPageListParamVO;
import util.paramvo.SearchParamVO;
import vo.MajorunitVO;

public interface MajorunitDAO {
	
	/**
	 * 리스트를 foreach를 이용해서 검색. 인자는 리스트 대신 배열로 바꿔도 됨.
	 * 학과유닛의 대학,단대,학부,학과,계열,세부계열은 join해서 name도 가져올 것.
	 * 로고도 가져와야 함.
	 * null이 들어오는 경우 전부 다.
	 * @param 검색값 토큰 리스트, 정렬할 컬럼, 4년제/2년제, 한 페이지 당 줄 수, 불러올 페이지
	 * @return 유닛리스트
	 */
	public List<MajorunitVO> getSearchedUnitByWord(SearchParamVO search) throws Exception;
	
	/**
	 * 검색값에 해당하는 학과유닛 총 수
	 * @param search 검색값 토큰 리스트, 4년제/2년제
	 * @return
	 */
	public int countSearchedUnitByWord(SearchParamVO search) throws Exception;

	/**
	 * 해당 세부계열의 학과유닛 리턴.
	 * 학과유닛의 대학,단대,학부,학과,계열,세부계열은 join해서 name도 가져올 것.
	 * 로고도 가져와야 함.
	 * @param search 세부계열no, 정렬할 컬럼, 한 페이지 당 줄 수, 불러올 페이지
	 * @return 검색결과 학과유닛 리스트
	 */
	public List<MajorunitVO> getSearchedUnitBySubline(SearchParamVO search) throws Exception;
	
	/**
	 * 해당 세부 계열 학과유닛 총 수
	 * @param search 세부계열no, 4년제/2년제
	 * @return
	 */
	public int countSearchedUnitBySubline(SearchParamVO search) throws Exception;
	
	/**
	 * 해당 계열의 학과유닛 리턴.
	 * 학과유닛의 대학,단대,학부,학과,계열,세부계열은 join해서 name도 가져올 것.
	 * 로고도 가져와야 함.
	 * @param search 세부계열no, 정렬할 컬럼, 한 페이지 당 줄 수, 불러올 페이지
	 * @return 검색결과 학과유닛 리스트
	 */
	public List<MajorunitVO> getSearchedUnitByLine(SearchParamVO search) throws Exception;
	
	/**
	 * 해당 계열 학과유닛 총 수
	 * @param search 세부계열no, 4년제/2년제
	 * @return
	 */
	public int countSearchedUnitByLine(SearchParamVO search) throws Exception;
	
	/**
	 * 해당 지역의 학과유닛 리턴.
	 * 학과유닛의 대학,단대,학부,학과,계열,세부계열은 join해서 name도 가져올 것.
	 * 로고도 가져와야 함.
	 * @param search 지역no, 정렬할 컬럼, 한 페이지 당 줄 수, 불러올 페이지
	 * @return 검색결과 학과유닛 리스트
	 */
	public List<MajorunitVO> getSearchedUnitByRegion(SearchParamVO search) throws Exception;

	/**
	 * 해당 지역 학과유닛 총 수. overloading 때문에 생성자 따로 없음. set해서 만들어서 써야 함.
	 * @param search 지역no, 4년제/2년제
	 * @return
	 */
	public int countSearchedUnitByRegion(SearchParamVO search) throws Exception;
	
	/**
	 * mapper에 if 사용해서 입력한 종목에 따라 받아 옴. 진실이 거짓보다 높은 리뷰가 3개 이상인 학과
	 * @param column 1위를 가져올 종목
	 * @return 1위 학과유닛(대학,단대,학부,학과 name도. + 로고 포함)
	 */
	public MajorunitVO getTopUnit(String column) throws Exception;
	
	/**
	 * 지역 1위 유닛(로고 포함). 진실이 거짓보다 높은 리뷰가 3개 이상인 학과, 승인된 리뷰에 한해
	 * @param region_no 1위를 가져올 지역 no
	 * @return 1위 학과유닛(대학,단대,학부,학과 name도. + 로고 포함)
	 */
	public MajorunitVO getRegionTopUnit(int region_no) throws Exception;
	
	/**
	 * 세부계열 1위 유닛(로고 포함). 진실이 거짓보다 높은 리뷰가 3개 이상인 학과
	 * @param region_no 1위를 가져올 지역 no
	 * @return 1위 학과유닛(대학,단대,학부,학과 name도. + 로고 포함)
	 */
	public MajorunitVO getLineTopUnit(int subline_no) throws Exception;
	
	/**
	 * 학과유닛 하나 불러오기(로고 포함). 학교, 단대, 학부, 학과는 join 해서 name도 모두
	 * @param majorunit_no
	 * @return
	 */
	public MajorunitVO getOneUnit(int majorunit_no) throws Exception;

	/**
	 * 관심 등록한 유닛 가져오기
	 * @param member_no
	 * @return majorunit_no, 대학, 단대, 학부, 학과 name 모두
	 */
	public List<MajorunitVO> getInterestedUnit(MemberPageListParamVO param) throws Exception;

	/**
	 * 종목별 1~3위 학과유닛
	 * @param column
	 * @return
	 */
	public List<MajorunitVO> getTop3Unit(String column) throws Exception;

}
